#__iter__
#迭代器
#1、当类中定义了 __iter__和__next__两个方法
#2、__iter__方法需要返回对象本身，即:self
#3、__next__方法，返回下一个数据，如果没有数据了，则需要抛出一个StopIteration的异常


#创建迭代器类型
# class IT(object):
#     def __init__(self):
#         self.count = 0
#     def __iter__(self):
#         return self
#     def __next__(self):
#         self.count += 1
#         if self.count == 3:
#             raise StopIteration
#         return self.count
#根据实例化创建一个迭代器对象
# obj1 = IT()
# v1=next(obj1) #obj1.__next__()
# print(v1)
# v2=next(obj1)
# print(v2)
# v3=next(obj1)  #取值结束，抛出异常
# print(v3)
# obj2 = IT()
# for i in obj2:    #for循环内部，先执行__iter__方法，获取一个迭代对象，然后不断执行next取值（有异常则终止循环）
#     print(i)

#生成器
#创建生成器函数
# def func():
#     yield 1
#     yield 2
#创建生成器对象（内部是根据生成器类generator创建的对象），生成器类的内部也声明了：__iter__、 __next__方法
# obj1=func()
# v1=next(obj1)
# print(v1)
# v2=next(obj1)
# print(v2)
# v3=next(obj1)
# print(v3)
# obj2=func()
# for i in obj2: #如果按照迭代器的规定来看，其实生成器也是一种特殊的迭代器
#     print(i)

#可迭代对象
#如果一个类中有__iter__方法并且返回一个迭代器对象（生成器对象），则我们称这个类创建的对象为可迭代对象
# class Foo(object):
#     def __iter__(self):
#         return self #返回的是迭代器对象
# obj = Foo()
#可迭代对象是可以使用for来进行迭代循环，在循环的内部其实是先执行__iter__方法，获取其迭代的对象，然后再在内部执行这个迭代对象的next
#功能，逐步取值
# for i in obj:
#     print(i)
# class IT(object):  #迭代器对象类
#     def __init__(self):
#         self.counter = 0
#     def __iter__(self):
#         return self
#     def __next__(self):
#         self.counter += 1
#         if self.counter == 3:
#             raise StopIteration()
#         return self.counter
# class Foo(object):  #可迭代对象类
#     def __iter__(self):
#         return IT()
# obj = Foo() # 可迭代对象
# for item in obj: # 循环可迭代对象时，内部先执行obj.__iter__并获取迭代器对象；不断地执行迭代器对象的next方法。
#     print(item)


#基于可迭代对象，迭代实现：自定义range
# class IterRange(object):
#     def __init__(self, num):
#         self.num = num
#         self.counter = -1
#     def __iter__(self):
#         return self
#     def __next__(self):
#         self.counter += 1
#         if self.counter == self.num:
#             raise StopIteration
#         return self.counter
# class Range(object):
#     def __init__(self, max_num):
#         self.max_num = max_num
#     def __iter__(self):
#         return IterRange(self.max_num)
# obj=Range(5)
# for i in obj:
#     print(i)


#原型
# class Foo(object):
#     def __iter__(self):
#         yield 1
#         yield 2
#基于可迭代对象，生成器实现：自定义range
# class Range(object):
#     def __init__(self, max_num):
#         self.max_num = max_num
#     def __iter__(self):
#         couter=0
#         while couter < self.max_num:
#             yield couter
#             couter += 1
# obj = Range(5)
# for i in obj:
#     print(i)

# v1=[1,5,9]
# print(v1)
# print(dir(v1))
# print(dir(dir(v1).__iter__()))




# a,b,c="xxx.mmmm.kkkk".split(".",maxsplit=2)
# print(a)
# print(b)
# print(c)